#include <iostream>
#include <string>
#include <vector>
#include <set>
#include <chrono>
#include <sw/redis++/redis++.h>
#include "../util.hpp"
using namespace std::chrono_literals;	// 字面量
using sw::redis::Redis;

void test1(Redis& redis){
    std::cout << "sadd & spop & smembers" << std::endl;
    redis.flushall();

    redis.sadd("myset", "111"); // 插入单个元素, 基于初始化列表
    // 插入一组元素, 基于迭代器
    std::vector<std::string> values = {"222", "333", "444"};
    redis.sadd("myset", values.begin(), values.end());

    auto num = redis.spop("myset"); // 随机弹出1个元素
    std::cout << "spop: " << num.value_or("null") << std::endl;

    // 获取集合元素
    std::vector<std::string> res;
    redis.smembers("myset", std::back_insert_iterator(res));
    printContainer(res);
}

void test2(Redis& redis){
    std::cout << "scard & sismember" << std::endl;
    redis.flushall();

    redis.sadd("key", {"111", "222", "333"});
    std::cout << "集合元素个数: " << redis.scard("key") << std::endl; 
    std::cout << "是否包含元素 111: " << redis.sismember("key", "111") << std::endl;
    std::cout << "是否包含元素 444: " << redis.sismember("key", "444") << std::endl;
}

void test3(Redis& redis){
    std::cout << "sinter & sinterstore" << std::endl;
    redis.flushall();
    
    redis.sadd("key1", {"111", "222", "333"});
    redis.sadd("key2", {"111", "222", "444"});
 
    // 计算两个集合的交集
    std::set<std::string> result;
    auto it = std::inserter(result, result.end());
    redis.sinter({"key1", "key2"}, it);
 
    // 打印交集结果
    printContainer(result);

    long long len = redis.sinterstore("key3", {"key1", "key2"});
    std::cout << "len: " << len << std::endl;
}

void test4(Redis& redis){
    std::cout << "srem & smove" << std::endl;
    redis.flushall();

    redis.sadd("set1", {"a", "b", "c"});
    redis.sadd("set2", {"d", "e"});

    // 移除元素
    redis.srem("set1", "b");
    std::cout << "set1 after srem: ";
    std::vector<std::string> res;
    redis.smembers("set1", std::back_insert_iterator(res));
    printContainer(res);

    // 移动元素
    redis.smove("set1", "set2", "c");
    std::cout << "set1 after smove: ";
    std::vector<std::string> res1;
    redis.smembers("set1", std::back_insert_iterator(res1));
    printContainer(res1);

    std::cout << "set2 after smove: ";
    std::vector<std::string> res2;
    redis.smembers("set2", std::back_insert_iterator(res2));
    printContainer(res2);
}

int main(){
    sw::redis::Redis redis("tcp://127.0.0.1:6379");
    // 如果 Redis 设置了密码，请在这里添加认证
    redis.auth("123456");  // 替换 Redis 密码
    // 测试函数
    test3(redis);

    return 0;
}